package cn.tedu.apiday01;

public class ApiOpject {//测试opject工具类
//ocp 不能修改源码，但是可以扩展
    public static void main(String[] args) {
        Student s = new Student("马化腾",20);
        Student s1 = new Student("马化腾",20);
        System.out.println(s.getAge());
        System.out.println(s.getName());
        System.out.println(s.hashCode());//使用了父类opject的功能，计算对象在内存中的哈希码值
        //System.out.println(s.toString());//使用了父类opject的功能。返回对象在内存中的地址值
        System.out.println(Integer.toHexString(1704856573));//哈希码值通过这个方法运算成地址值
        System.out.println(s);//打印结果默认展示了地址值，因为底层帮你调用了toString()
        Class c = s.getClass();
        System.out.println(c);
        //比较s和s1对象是否相等，默认使用的opject提供的equals（）方法，使用 == 比较
        //==比较基本类型的变量时，直接比值本身，比较引用类型的变量时，比的是地址值
        boolean b = s.equals(s1);
        System.out.println(b);//因为s和s1的地址值不一样，所有返回false结果
    }
}
class Student{//所有的类都默认继承自Object,也就是Opject这个父类里的功能，可以被任何类使用
    public Student() {
    }
    public Student(String name ,int age){
        super();
        this.age= age;
        this.name = name;
    }
    private String name;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    //opject里默认提供的toString（）的实现方式是显示对象的地址值，我不想要他显示地址值，想显示对象的属性值，于是就要重写toString（）
    //重写toString（）就可以展示重写之后的方法体，也就是可以展示属性值
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//现在比较两个对象 ，是提供Object提供的默认的比较方式，也就是比较两个对象的地址值
    //能不能按照对象间的属性值比较，如果两个对象的属性完全都一样，那就让两个对象相等，然后返回结果true
    @Override
    public boolean equals(Object o) {
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        Student student = (Student) o;
        //return age == student.age && Objects.equals(name, student.name);

        return true;
    }

    /*@Override
    public int hashCode() {
        return Objects.hash(name, age);
    }*/
}